#pragma once

#include <iostream>
#include <string>
#include <fstream>
#include <ctime>
#include <cstdio>


#define error(format,...) \
    Logger::instance()->log(Logger::ERROR,__FILE__,__FILE__,format,##__VA_ARGS__);

#define warn(format,...) \
    Logger::instance()->log(Logger::WRAN,__FILE__,__FILE__,format,##__VA_ARGS__);

#define info(format,...) \
    Logger::instance()->log(Logger::INFO,__FILE__,__FILE__,format,##__VA_ARGS__);

class Logger{
public:
    //日志级别
    enum Level{
        ERROR,
        WARN,
        INFO,
        LEVEL_COUNT
    };

    static Logger * instance();
    //要打开一个文件
    void open(const std::string & filename);
    //文件用完需要关闭
    void close();
    //日志写入文件的函数
    void log(Level level,std::string file,int line,std::string format);
    //level是日志所在级别
    //file是日志要传入的文件
    //line是出问题的行号
    //format是日志的内容

    static std::string Convert(float Num);

private:
    Logger();
    ~Logger();
    //单例模式

private:
    std::string m_filename;  //表示记录到哪个文件
    std::ofstream m_fout;
    //为了方便记录日志级别声明一个静态的字符数组
    static const char *s_level[LEVEL_COUNT];
    static Logger *m_instance;     //全局唯一的实例
};

